#ifndef EXPERIMENTRESULTUI_H
#define EXPERIMENTRESULTUI_H

#include <QAction>
#include <QCategoryAxis>
#include <QFileDialog>
#include <QLineSeries>
#include <QSplineSeries>
#include <QMenu>
#include <QMessageBox>
#include <QWidget>
#include <QValueAxis>
#include <QCategoryAxis>
#include <QVariant>
#include <thread>
#include <QItemSelectionModel>
#include <QTableWidgetItem>
#include <QModelIndex>
#include <QToolTip>
#include <QColor>

#include <QElapsedTimer>

#include <tuple>

//#include <QtTest/QTest>

#include "global.h"
#include "UiStruct.h"
#include "DyelibraryService.h"
#include "QPCRDB.h"
#include "printtool.h"
#include "custommessagebox.h"
#include "dataanalyse.h"
#include "analysisconfig.h"
#include "PreferencesService.h"
#include "resultcurvechart.h"

QT_CHARTS_USE_NAMESPACE

namespace Ui {
class ExperimentResultUi;
}


class ExperimentResultUi : public QWidget
{
    Q_OBJECT

public:
    explicit ExperimentResultUi(QWidget *parent = nullptr);
    ~ExperimentResultUi();

private:
    Ui::ExperimentResultUi *ui;

signals:
    void previousEvent();
    void nextEvent();
    void saveEvent();
    void changeRpItemBgColor(QModelIndexList indexList); // 选中反应版item，改变背景颜色信号

    void sendAnalysisTargetInfo(); // 发送数据分析相关靶基因信息

    void sigExport(); // 导出信号

    void sigCurveLabelFilter(QString filterNum); // 曲线过滤信号

    void updateyuzhi(QHash<QString,double> yuzhihash);
public slots:
    void slot_DL_RcOnTw(QPoint);
    void filter(QAction*);
    void ShowTooltip(QModelIndex index);
    void nextCallback();
    void tableClick(QModelIndexList indexList);

    void curveLabelFilter(QString filterNum); // 曲线过滤槽函数

    void renderYuzhiSlot(QHash<QString, double> yuZhiHash);

    void updateSingalYuzhi(QString key,double text);

    void receiveKey(QString key);


public:
    QList<QList<QHash<QString, QString>>> saveYingguangDataList; // 原始荧光值
    QList<QList<QHash<QString, QString>>> saveYingguangDataListDuplicate; // 原始荧光值副本
    QList<QList<QHash<QString, QString>>> analysingYingGuang; // 分析后的荧光值
    QList<QList<QHash<QString, QString>>> deltaYingGuang; // delta荧光值
    QList<QList<QHash<QString, QString>>> alysGuiYiYingGuang; // 分析归一化荧光值
    QList<QList<QHash<QString, QString>>> deltaGuiYiYingGuang; // delta归一化荧光值
    QList<QList<QHash<QString, QString>>> renderYingGuang; // 结果页面要渲染的荧光值
    QHash<QString, QString> targetLegend;
    ReactionPlate reactionPlate;
    int cyclingNum;
    Experiment experiment;
    bool autoExportFlag; // 自动导出标识位
    bool updateCurveData; // 更新曲线信息标识位

    ResultCurveChart *resultChart;

    /* 数据分析工具栏 */
    AnalysisConfig *alyscfg;
    /* 偏好设置 */
    PreferencesService *preferencesService;

public:
    QList<QList<QHash<QString, QString>>> sendYingguangData();
    void clearResultCurve(); // 清除结果曲线
    void getResultData(ReactionPlate reactionPlate, int cyclingNum, Experiment experiment); // 获取结果页面所需数据
    void getResultData(); // 获取结果页面所需数据
    void previousBtnIsvalid();
    void renderResultCurve(); // 渲染结果曲线
    void logarithmCurve();

    QList<QString> returnPageInfos(); // 返回数据信息

    void readAndRenderTableRowColumnFromXML();

    void updateDataAnalysisInfo(QList<AnalysisTarget> alysTar); // 配置分析工具栏更新，重新渲染数据分析相关信息

    QList<AnalysisTarget> getAnalysisTarget(); // 返回数据分析用靶基因

    void createResultChart(); // 创建结果页面图表

private:
    int xAxisMaximum;
    int xSeries;
    int yAxisMaximum;
    int initYAxisMaxmum;
    int logarithmYMaxiMum; // 最大对数y轴数据

    CustomMessageBox *cusMsg;
    QString targetLegendColor1;
    QString targetLegendColor2;
    QString targetLegendColor3;
    QString targetLegendColor4;
    QString targetReporter1;
    QString targetReporter2;
    QString targetReporter3;
    QString targetReporter4;
    QList<QHash<QString, QString>> yingGuangData;
    QList<QSplineSeries*> resCy5SeriesList;
    QList<QSplineSeries*> resFamSeriesList;
    QList<QSplineSeries*> resVicSeriesList;
    QList<QSplineSeries*> resRoxSeriesList;
    QCategoryAxis *resultXAxis; // x轴
    QValueAxis *resultYAxis; // y轴
    QCategoryAxis *logarithmYAxis; // 对数图纵轴
    ConfigFileService *configService;
    QList<QHash<QString,QString>> dyeFromConfig;
    int *sampleTableRowColumn;
    DyeLibrary *dyeLibrary;
    QList<QHash<QString,QString>> allDyeInfos;
    QMenu *tableMenu;
    QAction *action_print;
    QAction *action_export;
    QMenu *menu;
    QAction *action_1;
    QAction *action_2;
    QAction *action_3;
    PrintTool *pTool;
    QModelIndex normalIndex;

    /* 数据分析服务 */
    dataanalyse *dAlys;
    /* 数据分析所用参数 */
    QList<double> ct; // ct值
//    QList<bool> yuZhiLineFilterCt; // 阈值线超过曲线过滤ct值 128
    QHash<QString, double> yuZhiHash; // 阈值
    QHash<QString, int> alysConfigs; // 配置文件中除阈值外的其他配置信息
    double alysCfgYuZhi; // 配置文件中阈值
    QList<QHash<QString, int>> baseLineList; // 基线数组
    QList<QHash<QString, QString>> targetNameList; // 报告基因所对应的靶基因名称数组

    QList<AnalysisTarget> alysTar; // 数据分析所用的靶基因信息
    bool firstInitAlysTar; // 第一次初始化分析靶基因状态

    int isGuiYi; // 是否归一化（0-关闭/1-开启）
    int isDeltaRn; // 是否为ΔRn
    qreal resultYAxisMax; // 记录y轴最大值
    qreal resultYAxisMin; // 记录y轴最小值
    bool isChartInit; // 是否为图表的初始状态（没有荧光数据）（计算y轴刻度使用）

    /* 阈值渲染相关 */
    QHash<QString, QSplineSeries*> yuZhiSeries; // 阈值系列列表
    QList<QString> validYuZhiList; // 合法阈值线数组
    QHash<QString, QColor> colorHash; // 阈值颜色Hash
    QHash<QString, YuzhiLineEdit*> yuZhiLabelHash; // 阈值标签

    /* 记录选中的靶基因图例 */
    // 曲线图例
    bool cy5Visible;
    bool famVisible;
    bool vicVisible;
    bool roxVisible;

private:
    void renderResultTable(); // 渲染结果页反应板
    void sleep(int msec);
    void slotActionExport();
    void slotActionSave();

    void ctFilter(); // 过滤阈值线超过曲线ct值不为0的问题

    void curveFilter(QString selector); // 曲线过滤
    void yuZhiLineFilter(); // 阈值线过滤

    QHash<QString, QString> getReactionPlateTarget();
    void renderFilterList();
    void updateTable();
    QColor stringToColor(QString colorStr);
    void filterSelectedCurve(); // 过滤选中的反应板的曲线
    void boldCurve(); // 加粗曲线
    void unboldCurve(); //取消加粗曲线


    void dataAnalysis(); // 数据分析函数

    void yAxisTickRender(bool isInit, bool isGuiYi); // 纵轴刻度渲染
    void logarithmYAxisTickRender(); // 对数图纵轴刻度渲染

    QHash<QString, double> yuZhiCalculation(QList<QHash<QString, QString>> allYuZhi); // 阈值计算函数
    void renderYuZhiLine(QHash<QString, double> yuZhiHash, QHash<QString, QColor> yuZhiLineColor); // 阈值渲染函数
    QHash<QString, YuzhiLineEdit*> yuZhiLabel(QHash<QString, QColor> labelTextColor); // 生成阈值label
    QHash<QString, QSplineSeries*> createAndSetYuZhiSeries(QList<QString> validYuZhiList); // 创建并绑定阈值序列
    void renderYuZhiData(); // 渲染阈值相关数据
    void clearYuZhi(); // 清除阈值相关渲染信息
    QHash<QString, double> initYuZhi(QHash<QString, double> yuZhiHash); // 初始化阈值Hash

    std::tuple<QHash<QString, QColor>, QList<QString>> getTargetColor(); // 获取靶基因颜色列表m
    QHash<QString, QColor> getSampleColor(); // 获取样本颜色列表

    void renderRplateCts(QList<double> ct, QList<bool> list); // 渲染结果页面反应板列表ct值

    QList<AnalysisTarget> setAnalysisTargetData(QList<QHash<QString, QString>> targetNameList,
                                                QHash<QString, double> yuZhiHash,
                                                QList<QHash<QString, int>> baseLineList); // 写入数据分析所用的靶基因
    void updateAnalysisTargetData(QList<QHash<QString, QString>> targetNameList,
                                  QHash<QString, double> yuZhiHash,
                                  QList<QHash<QString, int>> baseLineList); // 更新数据分析所用的靶基因
    void splitTargetToValues(QList<AnalysisTarget> alysTar); // 拆分靶基因数据到各个变量

    void renderLegendStyle(); // 渲染图例样式
    void renderLineDataStyle(); // 渲染结果曲线数据样式


};

#endif // EXPERIMENTRESULTUI_H
